<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    逻辑运算符:操作应用与任何类型的操作数.不仅仅是布尔值 && 逻辑与 ||逻辑或
    !逻辑非 1.逻辑与 在有一个数不是布尔值的情况下,逻辑与的操作不一定会返回布尔值
    逻辑与属于短路操作,如果第一个操作数能够决定结果,那么就不会对第二个操作数进行求值
    1.1将操作数转换为布尔值进行运算,但是它的结果不一定是布尔值,结果是操作数的值
    如果第一个操作数为真,继续第二个操作数,找到假的就结束,如果到最后无法找到假的,那么最后的操作数就是最终的结果
    如果第一个操作数为假的情况,直接结束了.第一个操作数就是结果,其他的操作数都会短路,跳过不执行.
    <script>
      // console.log(1 && 2 && 3);//3
      // console.log(false && 哈哈哈哈哈);//false
      // console.log(1 && 2 && true && "张小胖");//张小胖
      // console.log(3 && 5);//5
      // console.log(3>2 && 5<4);false
    </script>

    2.逻辑或 || 逻辑与和逻辑或相似的,
    如果有一个操作数不是布尔值,逻辑或的操作数不一定是布尔值
    逻辑或属于短路操作,如果第一个操作数的求值结果为true,那么就不会对第二个操作数进行求值
    2.1将操作数转换为布尔值进行运算,但是它的结果不一定是布尔值,结果是操作数的值
    如果第一个操作数为真,,直接结束了.其他的操作数都会短路,跳过不执行.
    如果第一个操作数为假的情况,继续第二个操作数,找到真的就结束,最后的操作数就是最终的结果

    <script>
      // console.log(null || 1);//1
      // 分析:
      // console.log(Boolean(null));//false
      // console.log(null || 1 || 2);//1
      // console.log(1 || hhhhhh);//1
      // console.log(0 || false ||undefined);//undefined
      // console.log(Boolean(undefined));

      // console.log(1 && 2 || 3);//2
      // console.log(1 || 2 && 3);//1

      // console.log(3>2 || 5<4);//true
    </script>

    3. ! 逻辑非 取反 这个操作符一定会返回布尔值
    <script>
      console.log(!5); //f
      console.log(!!5); //t
      console.log(!!0); //f
      console.log(!!NaN); //f
      console.log(!!undefined); //f
    </script>

    <script>
      // 需求:给变量a赋值,如果有值使用a的值,如果没有值的情况下,使用a后面的值.5
      var a;
      var b = a || 5; // 如果第一个操作数为假的情况,继续第二个操作数,找到真的就结束,最后的操作数就是最终的结果
      console.log(b); //5
    </script>
  </body>
</html>
